#include "ringQueue.hpp"

void *_customer(void *args) // 消费
{
    ringQueue<Task> *rq = static_cast<ringQueue<Task> *>(args);
    while (1)
    {
        Task t;
        rq->pop(t); // 拿到数据
        t();
        cout << "消费者： |" << t.formatArg() << t.formatRes() << endl;
    }
}
void *_productor(void *args)
{
    ringQueue<Task> *rq = static_cast<ringQueue<Task> *>(args);
    while (1)
    {
        int x = rand() % 100;
        int y = rand() % 100;
        const char *_op = "+-*/%";

        char op = _op[(x * x + y * y) % 5];
        Task t(x, y, op);
        rq->push(t); // 生产数据；
        cout << "生产者： |" << t.formatArg() << " ?" << endl;
    }
}
int main()
{
    srand((int)time(nullptr));
    ringQueue<Task> *rq = new ringQueue<Task>(5);
    pthread_t customer[CUSTOMERNUM], productor[PRODUCTORNUM];
    for (int i = 0; i < CUSTOMERNUM; i++)
    {
        pthread_create(customer + i, nullptr, _customer, rq); // 创建多消费者
    }
    for (int i = 0; i < PRODUCTORNUM; i++)
    {
        pthread_create(productor + i, nullptr, _productor, rq); // 创建多生产者
    }
    for (int i = 0; i < CUSTOMERNUM; i++)//回收消费者
    {
        pthread_join(customer[i], nullptr);
    }
    for (int i = 0; i < PRODUCTORNUM; i++)//回收生产者
    {
        pthread_join(productor[i], nullptr);
    }

    return 0;
}